package be.ipl.pigolo.domaine;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Cochon implements Serializable {

	/**
	 * Enuméré représentant la couleur du cochon
	 * 
	 */
	public enum Couleur {
		VERT, BLANC, ROUGE, GRIS
	}

	/**
	 * Enuméré représentant l'état du cochon
	 * 
	 */
	public enum Etat {
		RAMASSER, NON_RAMASSER
	}

	private int id;

	private int x;

	private int y;

	private Etat etat;

	private Couleur couleur;

	public Cochon(int id, Couleur couleur, Etat etat) {
		this.id = id;
		this.couleur = couleur;
		this.etat = etat;
	}

	public Cochon(int id, int x, int y, Couleur couleur, Etat etat) {
		super();
		this.id = id;
		this.x = x;
		this.y = y;
		this.couleur = couleur;
		this.etat = etat;

	}

	/**
	 * Méthode qui renvoie la coordonnée en X du cochon
	 * 
	 * @return x
	 */
	public int getX() {
		return x;
	}

	/**
	 * Méthode qui permet de modifier la coordonnée en X du cochon
	 * 
	 * @param x
	 *            , la nouvelle coordonnée
	 */
	public void setX(int x) {
		this.x = x;
	}

	/**
	 * Méthode qui renvoie la coordonnée en Y du cochon
	 * 
	 * @return y
	 */
	public int getY() {
		return y;
	}

	/**
	 * Méthode qui permet de modifier la coordonnée en Y du cochon
	 * 
	 * @param y
	 *            , la nouvelle coordonnée
	 */
	public void setY(int y) {
		this.y = y;
	}

	/**
	 * Méthode qui renvoi l'énuméré de la couleur du cochon
	 * 
	 * @return la couleur
	 */
	public Couleur getCouleur() {
		return this.couleur;
	}

	/**
	 * Méthode qui renvoi l'énuméré de la couleur du cochon sous forme de chaîne
	 * de caractères
	 * 
	 * @return la couleur
	 */
	public String getCouleurName() {
		return this.couleur.name();
	}

	/**
	 * Méthode qui renvoi l'énuméré de la couleur du cochon sous forme de chaîne
	 * de caractères en anglais utile pour les css
	 * 
	 * @return la couleur
	 */
	public String getCouleurJeu() {
		switch (this.getCouleurName()) {
		case "VERT":
			return "green";
		case "BLANC":
			return "white";
		case "ROUGE":
			return "red";
		case "GRIS":
			return "grey";
		default:
			return null;
		}
	}

	/**
	 * Méthode qui permet de modifier la couleur du cochon
	 * 
	 * @param couleur
	 */
	public void setCouleur(Couleur couleur) {
		this.couleur = couleur;
	}

	/**
	 * Méthode qui renvoie l'id du cochon
	 * 
	 * @return id
	 */
	public int getId() {
		return this.id;
	}

	/**
	 * Méthode qui renvoie l'état du cochon
	 * 
	 * @return etat
	 */
	public Etat getEtat() {
		return this.etat;
	}

	/**
	 * Méthode qui permet de modifier l'état du cochon
	 * 
	 * @param etat
	 *            Nouvel état du cochon
	 */
	public void setEtat(Etat etat) {
		this.etat = etat;
	}

	public int compareToCouleur(Couleur c1, Couleur c2) {
		if (c1.compareTo(c2) < 0)
			return -1;
		else if (c1.compareTo(c2) > 0)
			return 1;
		else
			return 0;
	}

	public boolean comparePosition(Cochon cochon) {
		if (this.x == cochon.getX()) {
			if (this.y == cochon.getY())
				return false;
			else
				return true;
		}
		return true;
	}

	/**
	 * Teste si la couleur passée en paramètre est la même que celui du cochon
	 * (Si le paramètre = null alors le cochon doit être gris)
	 * 
	 * @param couleur
	 *            Couleur à comparer à celui du cochon
	 * @return True si de même couleur ou si le cochon est gris et que le
	 *         paramètre est null
	 */
	public boolean compareCouleur(DeValeur.Couleur couleur) {
		if (this.couleur == Couleur.GRIS && couleur == null)
			return true;
		if (this.couleur == Couleur.VERT && DeValeur.Couleur.VERT == couleur)
			return true;
		if (this.couleur == Couleur.BLANC && DeValeur.Couleur.BLANC == couleur)
			return true;
		if (this.couleur == Couleur.ROUGE && DeValeur.Couleur.ROUGE == couleur)
			return true;
		return false;
	}

	public String toString() {
		return "id: " + id + "; x: " + x + "; y: " + y + "; couleur: "
				+ couleur.name() + "; etat: " + etat.name();
	}
}
